<?php
$GLOBALS["start_time"]=microtime(true);
require_once FW.'functions.php';
require_once FW.'alias.php';
require_once FW.'model.php';
spl_autoload_register("autoload", true);
class S {
    private static $instance = null;
    private $objects = array();

    /** @return S */
    private static function getInstance() {
        if (self::$instance == null) {
            self::$instance = new S();
        }
        return self::$instance;
    }

    static function getObject() {
        $args = func_get_args();
        $name = array_shift($args);
        $dir = array_shift(explodeCase($name));
        $objects = self::getInstance()->objects;
        if (!isset($objects[$name])) {
            $cname = "fw" . ucfirst($name);
            $file = FW . $dir . DS . $cname . ".class.php";
            if (file_exists($file)) {
                include_once FW . $name . DS . $cname . ".class.php";
                if (class_exists($cname)) {
                    $objects[$name] = new $cname($args);
                    return $objects[$name];
                }
            }
        }
        return null;
    }
    
    /**
     * Проверка данных
     * @return fwValidator
     */
    static function validator() {
        return self::getObject("validator");
    }

    /**
     * Обрабатывает логику запросов
     * @return fwAction
     */
    static function action() {
        return self::getObject("action");
    }


    /**
     * Кеширование данных
     * @return fwCache 
     */
    static function cache() {
        return self::getObject("cache");
    }

    /**
     * Работа с конфигурацией всего проекта.
     * @return fwConfig 
     */
    static function config() {
        return self::getObject("config");
    }

    /**
     * Контроллер движения запроса
     * @return fwController 
     */
    static function controller() {
        return self::getObject("controller");
    }

    /**
     * Для работы в application, нужно использовать ТОЛЬКО модели!
     * @return fwDb 
     */
    static function db() {
        return self::getObject("db");
    }
    
    /**
     * @return fwRender
     */
    static function render() {
        return self::getObject("render");
    }

    /**
     * Представление маршрутов.
     * @return fwRoute 
     */
    static function route() {
        return self::getObject("route");
    }

    /**
     * Работа с представлением
     * @return fwView 
     */
    static function view() {
        return self::getObject("view");
    }

    /*
     * Работа с ошибками и логами
     * @return fwLog
     */
    static function log() {
        return self::getObject("log");
    }
    
    /**
     * @return fwException
     */
    static function ex(){
        return self::getObject("exception");
    }
}
